#ifndef _MEDIA_CLOCK_H_
#define _MEDIA_CLOCK_H_

#ifdef __cplusplus
extern "C" {
#endif

#include "lv_drv_conf.h"

#if (USE_CRANE_LCD || USE_CRANE_CAMERA)

#include "stdint.h"

#define MEDIA_CLK_OFFLINE        BIT(0)
#define MEDIA_CLK_ISP2X          BIT(1)
#define MEDIA_CLK_PHY            BIT(2)
#define MEDIA_CLK_INTERFACE      BIT(3)
#define MEDIA_CLK_OFFLINE_AXI    BIT(4)
#define MEDIA_CLK_LCD_CI         BIT(5)
#define MEDIA_CLK_LCD_AHB        BIT(6)
#define MEDIA_CLK_POWER          BIT(7)
#define MEDIA_CLK_LCD_SCLK         BIT(8)
#define MEDIA_CLK_LCD_AXI         BIT(9)
#define MEDIA_CLK_JPEG_FUNC         BIT(10)

enum media_clk_module_id{
    MODULE_CAMERA = 0,
    MODULE_DISPLAY,
    MODULE_VIDEO,
    MODULE_MAX,
};

enum media_clk_dump_level{
    LEVEL_DUMP_CLOCK_ONLY = 0,
    LEVEL_DUMP_CLOCK_TIMES,
};

enum media_clk_sub_module_id{
    SUB_MODULE_OFFLINE = 0,
    SUB_MODULE_ISP2X,
    SUB_MODULE_PHY,
    SUB_MODULE_INTERFACE,
    SUB_MODULE_OFFLINE_AXI,
    SUB_MODULE_LCD_CI,
    SUB_MODULE_LCD_AHB,
    SUB_MODULE_POWER,  // multimedia power
    SUB_MODULE_LCD_SCLK,
    SUB_MODULE_LCD_AXI,
    SUB_MODULE_JPEG_FUNC,
    SUB_MODULE_MAX
};

int media_clock_set_rate(int clk_type, int clk_rate);
int media_clock_enable(int clk_type, int module_id);
int media_clock_disable(int clk_type, int module_id);
int media_clock_power_on(int module_id);
int media_clock_power_off(int module_id);
int media_clock_dump(enum media_clk_dump_level dump_level);
void media_clock_set_bit(unsigned int  reg, unsigned int  val);
void media_clock_clr_bit(unsigned int  reg, unsigned int  val);
int media_clock_reset(uint32_t clk_type);

#endif /* (USE_CRANE_LCD || USE_CRANE_CAMERA) */

#ifdef __cplusplus
} /* extern "C" */
#endif

#endif
